home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / dev / misc / LEDA_gene.lha / LEDA-3.1c-generic / incl / LEDA / tree_collection.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-05  |  4.1 KB  |  135 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  tree_collection.h
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #ifndef LEDA_DYNTREES_H
  16. #define LEDA_DYNTREES_H
  17.  
  18. #include <LEDA/basic.h>
  19.  
  20.  /*********************************************************************
  21.  *                                                                     *
  22.  *  dyna_trees T; deklariert eine (vorerst leere) Menge von dyn_trees  *
  23.  *                                                                     *
  24.  *  d_vertex T.maketree(); Erzeugt einen Baum, der genau einen Knoten  *
  25.  *     enthaelt (der in keinen anderem Baum enthalten ist.             *
  26.  *                                                                     *
  27.  *  d_vertex T.findroot(d_vertex v); Gibt die Wurzel des v enthaltenden*
  28.  *     Baumes zurueck.                                                 *
  29.  *                                                                     *  
  30.  *  d_vertex T.findcost(d_vertex v, double& d); Gibt den entsprechenden*
  31.  *     Knoten zurueck (s.o.), die Kosten werden im Argument d zurueck- *
  32.  *     gegeben.                                                        *
  33.  *                                                                     *
  34.  *  void   T.addcost(d_vertex v, double x); s.o.                       *
  35.  *                                                                     *
  36.  *  void   T.link(d_vertex v, d_vertex w); s.o.                        *
  37.  *                                                                     *
  38.  *  void   T.cut(d_vertex v); s.o.                                     *
  39.  *                                                                     *
  40.  *                                                                     *
  41.  * Implemented by Jan Timm                                             *
  42.  *                                                                     *
  43.  *********************************************************************/
  44.  
  45.  
  46.  
  47.  
  48.  
  49. class d_node;
  50. typedef d_node *d_vertex;
  51. typedef d_node *d_path;
  52.  
  53. class d_node {
  54.  
  55. friend class dyna_trees;
  56.  
  57.      void*    info;        // user-defined information
  58.  
  59.      d_vertex left,        // linkes Kind
  60.               right,       // rechtes Kind
  61.               parent,      // Elter
  62.               successor,   // Nachfolger (fuer Pfad)
  63.               next;        // fuer Verkettung fuer ~dyna_tree
  64.  
  65.      double dcost,
  66.             dmin;
  67.  
  68.      d_node(void* i) { 
  69.                        left=right=parent=successor=next=0;
  70.                        dcost=dmin=0;
  71.                        info = i;
  72.                       };
  73.    LEDA_MEMORY(d_node)
  74.  
  75. };
  76.   
  77.    
  78. class dyna_trees {
  79.      d_vertex first,
  80.             last;  // diese beiden Zeiger fuer ~dyna_tree
  81.  
  82.      void splay(d_vertex);
  83.  
  84.      d_vertex assemble(d_vertex, d_vertex, d_vertex);
  85.      void   disassemble(d_vertex, d_vertex&, d_vertex&);
  86.  
  87.      d_vertex makepath(void*);
  88.      d_vertex findpath(d_vertex);
  89.      d_vertex findpathcost(d_path, double&);
  90.      d_vertex findtail(d_path);
  91.      void   addpathcost(d_path, double);
  92.      d_vertex join(d_path, d_path, d_path);
  93.      void   split(d_vertex, d_vertex&, d_vertex&);
  94.      
  95.      d_path   expose(d_vertex);
  96.  
  97. virtual void copy_inf(GenPtr& x)      { x=x; }
  98. virtual void clear_inf(GenPtr& x)     { x=0; }
  99.  
  100. public:
  101.      dyna_trees() { first=last=0; };
  102.      virtual ~dyna_trees();
  103.  
  104.      void*    inf(d_vertex v) { return v->info; }
  105.        
  106.      d_vertex maketree(void*);
  107.      d_vertex findroot(d_vertex);
  108.      d_vertex findcost(d_vertex, double&);
  109.      void   addcost(d_vertex, double);
  110.      void   link(d_vertex, d_vertex);
  111.      void   cut(d_vertex);
  112. };
  113.  
  114.  
  115. template<class itype>
  116.  
  117. class _CLASSTYPE  tree_collection : public dyna_trees{
  118.  
  119. void copy_inf(GenPtr& x)      { x=Copy(ACCESS(itype,x)); }
  120. void clear_inf(GenPtr& x)     { Clear(ACCESS(itype,x));  }
  121.  
  122. public:
  123.  
  124. d_vertex maketree(itype x)  { return dyna_trees::maketree(Convert(x)); }
  125. itype    inf(d_vertex v)    { return ACCESS(itype,dyna_trees::inf(v)); }
  126.  
  127.  tree_collection() {}
  128. ~tree_collection() {}
  129.  
  130. };
  131.  
  132. #endif
  133.  
  134.